머신러닝_08_양자화와 모델 경량화
1. 양자화의 발상
양자화는 모델이 쓰는 숫자의 표현을 더 거친 단계로 줄이는 기술이다. 말이 어렵게 들리지만 발상은 단순하다. 꼭 32비트 부동소수점으로 표현하지 않아도 되는 값을 더 적은 비트 수로 저장하고 계산하자는 것이다.
모델 안의 가중치나 활성값은 원래 연속적인 실수처럼 다뤄진다. 그런데 실제 하드웨어는 결국 이 값을 메모리에 저장하고 연산 장치에서 처리해야 한다. 이때 표현 단위를 줄이면 저장 공간이 줄고, 메모리 대역폭 부담이 줄고, 연산도 더 가벼워진다. 양자화가 경량화의 핵심 축으로 불리는 이유가 여기에 있다.
2. 비트 수와 표현 정밀도
비트 수가 줄어든다는 건 표현 가능한 값의 단계가 줄어든다는 뜻이다. 32비트에서 8비트로 내려가면 훨씬 더 적은 단계만 쓸 수 있다. 그래서 원래의 실수 값을 그대로 담지 못하고, 일정한 스케일에 맞춰 근사해서 저장하게 된다.
이 과정에서 자주 나오는 개념이 scale과 zero-point다. 값을 일정 범위 안에 다시 배치하고, 그 범위를 작은 정수 구간에 대응시키는 방식이다. 수학적으로 보면 연속적인 값을 더 적은 단계의 격자 위로 올려놓는 셈이다.
문제는 여기서 정밀도가 줄어든다는 점이다. 값의 차이가 아주 미세할 때는 양자화 뒤에 그 차이가 사라질 수 있다. 그래서 양자화는 메모리 절약 기술이면서 동시에 정보 손실 기술이기도 하다.
3. 8비트와 4비트
실무에서 가장 자주 거론되는 건 8비트와 4비트다. 8비트 양자화는 비교적 안정적이다. 메모리 사용량을 크게 줄이면서도 성능 저하를 비교적 잘 버티는 편이라서, 많은 경우 첫 선택지로 검토된다.
4비트는 더 공격적이다. 메모리 절감 효과는 더 크지만, 정밀도 손실도 그만큼 커진다. 그래서 모든 모델과 모든 계층에서 똑같이 잘 버티는 건 아니다. 어떤 모델은 4비트에서도 생각보다 잘 유지되지만, 어떤 모델은 금방 품질이 흔들린다.
결국 8비트와 4비트의 차이는 단순히 "더 작다"가 아니다. 어디까지 줄여도 모델이 망가지지 않는가를 찾는 문제에 가깝다. 그래서 양자화는 저장 형식의 문제가 아니라 성능과 비용 사이의 절충 문제로 읽는 편이 맞다.
4. 메모리, 속도, 전력
양자화가 반가운 이유는 이 세 가지를 동시에 건드리기 때문이다.
먼저 메모리 사용량이 줄어든다. 모델이 차지하는 공간이 줄면 더 작은 GPU나 때로는 CPU 환경에서도 돌릴 수 있다. 다음으로 메모리 대역폭 부담이 내려간다. 큰 모델에서는 계산 자체보다 데이터를 옮기는 비용이 병목이 되는 경우가 많은데, 양자화는 이 병목을 줄이는 데 도움이 된다.
전력 문제도 무시하기 어렵다. 연산량과 메모리 이동량이 줄면 소비 전력도 함께 낮아질 수 있다. 그래서 양자화는 단순한 실험실 기법이 아니라, 실제 배포 환경에서 모델을 버티게 만드는 기술로 자주 쓰인다.
다만 속도는 항상 일방적으로 빨라지는 게 아니다. 하드웨어와 라이브러리가 어떤 비트 연산을 얼마나 잘 지원하느냐에 따라 체감 성능은 달라진다. 그래서 양자화는 원리만 보고 판단하기보다, 실제 런타임에서 재보는 쪽이 맞다.
5. 정확도 손실과 위험 구간
양자화의 대가도 분명하다. 값 표현이 거칠어지면 모델이 원래 가지고 있던 민감한 차이를 잃을 수 있다. 특히 분포가 치우친 계층이나 작은 차이에 민감한 부분에서는 손실이 더 크게 드러날 수 있다.
그래서 양자화는 "무조건 줄일수록 좋다"는 기술이 아니다. 모델이 어느 정도까지 견디는지 봐야 한다. 어떤 경우에는 8비트까지만 줄여도 충분하고, 어떤 경우에는 4비트까지 내려가야 장비에 들어간다. 그리고 그 판단은 결국 품질 저하를 어디까지 받아들일 수 있는가와 연결된다.
양자화를 이해한다는 건 숫자를 줄이는 방법 하나를 외우는 데 있지 않다. 성능, 메모리, 속도, 전력, 정확도 사이에서 어디를 희생할지 판단하는 감각을 배우는 데 더 가깝다. 그래서 경량화는 단순한 최적화가 아니라 배포 조건을 다시 설계하는 문제로 이어진다.